package com.sti.platform.util;

import com.sti.platform.model.Notice;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;

/**
 * 反射获取实体类的信息
 */
public class UtilReflex {

    public  static void  main(String args[]){
        Notice notice = new Notice();
        notice.setContent("啊啊啊");

        Map map = UtilReflex.reflexModel(notice);
        String params[] = (String[])map.get("params");//参数
        Object values[] = (Object[])map.get("values");;//参数值
        Map kvMap = (Map)map.get("kvMap");// 里面存了 参数-->参数值


        for (Object key : kvMap.keySet()) {
            System.out.println("key= "+ key + " and value= " + kvMap.get(key));
        }

        System.out.println(map);
    }

    /**
     * 这里的实体必须全部是String类型
     * 根据 实体 返回一个Map对象和两个对象数组
     * params 参数
     * values 参数值
     * kvMap 存放 Key-->val
     * @return
     */
    public static Map reflexModel(Object object){
        Map map = new HashMap();
        Map kvMap = new HashMap();
        List paramsList = new LinkedList();//用linkedList get有顺序
        List valuesList = new LinkedList();
        // 得到类的所有field
        Field[] allFields = object.getClass().getDeclaredFields();
        for (int i=0;i<allFields.length;i++) {
            Field field = allFields[i];
            String fieldName = field.getName();
            // 将有注解的field存放到map中
            if(fieldName=="serialVersionUID"){//考虑序列化 serialVersionUID
                continue;
            }
            String type = field.getGenericType().toString();
            try{
                if(type.equals("class java.lang.String")){//只要String类型的
                    Method method = (Method) object.getClass().getMethod(("get" + getMethodName(fieldName)));
                    String val = (String) method.invoke(object);// 调用getter方法获取属性值
                    if(val!=null && !"".equals(val)){//有 参数值了 在添加
                        paramsList.add(fieldName);
                        valuesList.add(val);
                        kvMap.put(fieldName,val);
                    }
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        String params [] = new String[paramsList.size()];
        Object values [] = new Object[valuesList.size()];
        paramsList.toArray(params);
        valuesList.toArray(values);
        map.put("params",params);//参数
        map.put("values",values);//参数值
        map.put("kvMap",kvMap); //List 存放map Key-->val
        return map;
    }

    private static String getMethodName(String fildeName){
        byte[] items = null;
        try{
            items = fildeName.getBytes();
            items[0] = (byte) ((char) items[0] - 'a' + 'A');
        }catch (Exception e){
            e.printStackTrace();
        }
        return new String(items);
    }

    public String getQuerySql(String params[]){
        StringBuffer sb = new StringBuffer();
        sb.append(" where 1=1 ");
       if(params!=null && params.length>0){
           for(String param : params){

           }
       }

       return "";
    }
}
